const path = require('path');
const {app, BrowserWindow, nativeTheme, Tray, nativeImage, Menu, ipcMain} = require('electron');
const {initDownload} = require('./download')
const NODE_ENV = process.env.NODE_ENV
let mainWindow = null

function createWindow() {
    // 创建浏览器窗口
    mainWindow = new BrowserWindow({
        width: 1024,
        height: 800,
        icon: path.join(__dirname, '../dist/natalie.ico'),
        webPreferences: {
            preload: path.join(__dirname, 'preload.js'),
            nodeIntegration: true,
            contextIsolation: false
        },
    });
    nativeTheme.themeSource = 'dark'
    mainWindow.on('closed', (res) => {
        console.log('=== app closed ===')
        app.quit()
    })
    mainWindow.loadURL(
        NODE_ENV === 'development'
            ? 'http://localhost:3000'
            : `file://${path.join(__dirname, '../dist/index.html')}`
    );
    initDownload(mainWindow)
    if (NODE_ENV === 'development') {
        mainWindow.webContents.openDevTools();
    }
    createPrintWindow()
}

const template = [
    {
        label: '编辑',
        submenu: [
            {role: 'cut', label: '剪切'},
            {role: 'copy', label: '复制'},
            {role: 'paste', label: '粘贴'},
            {role: 'selectAll', label: '全选'}
        ]
    },
    {
        label: '窗口',
        submenu: [
            {role: 'reload', label: '刷新'},
            {role: 'forceReload', label: '强制刷新'},
            // { role: 'toggleDevTools',label: '控制台' },
            {type: 'separator'},
            {role: 'resetZoom', label: '重置'},
            {role: 'zoomIn', label: '放大'},
            {role: 'zoomOut', label: '缩小'},
            {type: 'separator'},
            {role: 'togglefullscreen', label: '全屏'}
        ]
    },
    {
        role: 'help',
        label: '帮助',
        submenu: [
            {
                label: '关于应用',
                click: async () => {
                    const {shell} = require('electron')
                    await shell.openExternal('http://www.psn.asia')
                }
            }
        ]
    }
]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
// 创建打印窗体
let printWindow

function createPrintWindow() {
    printWindow = new BrowserWindow({
        width: 800,
        height: 600,
        icon: path.join(__dirname, '../dist/natalie.ico'),
        show: false,
        resizable: false,
        fullscreenable: false,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false
        }
    })
    printWindow.removeMenu()
    const fileUrl = path.join(__dirname, 'static/printer.html')
    printWindow.loadFile(fileUrl)
    // printWindow.webContents.openDevTools();
    initPrinters()
}

// 打印窗体事件
function initPrinters() {
    // 获取打印机列表
    ipcMain.on('get-printers', (event, data) => {
        const printers = printWindow.webContents.getPrinters()
        mainWindow.webContents.send('get-printers', printers)
    })
    // 获取渲染进程传递过来的打印指令
    ipcMain.on('do-print', (event, data) => {
        const list = mainWindow.webContents.getPrinters()
        const defaultPrinter = list.find(x => x.status === 0 && x.isDefault)
        const dataResult = {
            html: data.html,
            deviceName: data.printerName || defaultPrinter.name
        }
        // 发送指令到printer.html
        printWindow.webContents.send('render-print', dataResult)
    })
    // 从printer.html传递过来的指令
    ipcMain.on('print-do', (e, data) => {
        printWindow.webContents.print({
            silent: true,
            printBackground: false,
            deviceName: data
        })
    })
}

const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
    app.quit()
} else {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
        if (mainWindow) {
            if (mainWindow.isMinimized()) {
                mainWindow.restore()
            }
            mainWindow.focus()
        }
    })
    let tray
    // 这段程序将会在 Electron 结束初始化和创建浏览器窗口的时候调用部分 API 在 ready 事件触发后才能使用。
    app.whenReady().then(() => {
        const icon = nativeImage.createFromPath(path.join(__dirname, '../dist/appicon.png'))
        tray = new Tray(icon)
        createWindow()
        app.on('activate', function () {
            // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他打开的窗口，那么程序会重新创建一个窗口。
            if (BrowserWindow.getAllWindows().length === 0) createWindow()
        })
    });
    // 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
    app.on('window-all-closed', () => {
        if (process.platform !== 'darwin') {
            app.quit();
        }
    });
}
